package com.rw.controller;

import com.rw.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;

/**
 * @author rabit
 */
@Controller
public class TestController {

    @RequestMapping("aa")
    public String test(){
        System.out.println("TestController的test方法执行了");
        return "aa";
    }

    @RequestMapping("bb")
    public String test2(HttpServletRequest request){
        int age = Integer.parseInt(request.getParameter("age"));
        String name = request.getParameter("name");
        System.out.println("TestController的test2方法执行了"+name +":"+age);
        return "bb";
    }

    /**
     * 解耦方式获取参数：
     * 由dispatchServlet来获取到参数，并且对这个参数进行类型转换，
     * 将再这个接收到的参数传递controller需要的方法的参数值中
     * dispatchServlet会根据调用函数参数的类型进行赋值
     * 赋值的标准是参数的名字和前端传入的参数的名字一致
     * @param name
     * @param age
     * @return
     */
    @RequestMapping("cc")
    public String test3(String name, Integer age){
        System.out.println("TestController的test3方法执行了"+name +":"+age);
        return "cc";
    }


    /**
     * 当前端传入的参数的键值和后端的接收参数的键值不一致的时候
     * 我们通过中间的一个转换机制将前端传入的键值和后端的参数进行匹配
     * 使用RequestParam注解可以进行转换
     * value:表示的前端传入key值
     * required：表示是否需要传递这个参数，
     *      默认为true，只要使用这个属性的，这个参数就必须传入
     *         false表示这个参数不是必须传入的
     * defaultValue：表示的是当前端不传入这个参数的时候，会读取默认值
     * @param name
     * @param age
     * @return
     */

    @RequestMapping("dd")
    public String test4(@RequestParam(value = "m",required = false) String name, @RequestParam(value = "a",required = false,defaultValue = "99") Integer age){
        System.out.println("TestController的test4方法执行了"+name +":"+age);
        return "ee";
    }

    @RequestMapping("ff")
    public String test5(User u){
        System.out.println("TestController的test5方法执行:"+u);
        return "ff";
    }


    /**
     * 当需要获取的同键不同值的参数的时候，
     * 后端在使用解耦合的方式来进行的获取的时候，
     * 需要使用数组来进行接收：
     * 注意：后端的接收的参数名和前端出入的键值必须一致
     * @param name
     * @return
     */
    @RequestMapping("hh")
    public String test5(Integer[] name){
        System.out.println("TestController的test6方法执行:");
        for (Integer i:name){
            System.out.println(i);
        }

        return "hh";
    }

    @RequestMapping("mm")
    public String test6(User u,String[] name,HttpServletRequest request){
        String pageNo = request.getParameter("pageNo");
        System.out.println(pageNo);
        System.out.println("TestController的test6方法执行:"+u);
        for (String i:name){
            System.out.println(i);
        }
        return "mm";
    }
    @RequestMapping("nn/{a}/{b}/{c}")
    public String test7(@PathVariable("a") Integer age,@PathVariable("c") String name,@PathVariable("b") String sex){
        System.out.println("TestController的test7方法执行:"+age+"-"+name+"-"+sex);
        return "nn1";
    }

    @RequestMapping("test")
    public String test8(HttpServletRequest request){
        String name = request.getParameter("name");
        System.out.println("TestController的test8方法执行:"+name);
        return "8test";
    }
}
